home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / archivers / xfd / developer / sources / asm / datapack.a < prev    next >
Text File  |  1999-06-14  |  5KB  |  223 lines

  1. * Programmheader
  2. *
  3. *    Name:        DataPACK
  4. *    Author:        SDI
  5. *    Distribution:    PD
  6. *    Description:    XFD external decruncher for unknown PACK data
  7. *    Compileropts:    -
  8. *    Linkeropts:    -
  9. *
  10. * 1.0   07.02.98 : first version
  11. * 1.1   08.02.98 : recognized Testament PACK as PP20 Clone, added PP2O and
  12. *    "Seek and Destroy" PP-Clones
  13. * 1.2   09.02.98 : little fixes
  14. * 1.3   28.02.98 : better Pepsi-Recognition
  15. * 1.4   03.03.98 : removed PP2O
  16. * 1.5   11.11.98 : removed PP20-Clone
  17.  
  18.         INCLUDE    "AINCLUDE:IncDirs.i"
  19.         INCLUDE    "lvo.i"
  20.  
  21.         INCLUDE    "libraries/xfdmaster.i"
  22.         INCLUDE    "exec/memory.i"
  23.  
  24.         * head function for tests
  25. *        INCLUDE    "xfdExeHead.a"
  26.  
  27. ForeMan        MOVEQ    #-1,D0        ;security
  28.         RTS
  29.  
  30.         DC.L    XFDF_ID
  31.         DC.W    1,0
  32.         DC.L    0,0,Slave1
  33.  
  34.         DC.B    "$VER: DataPACK 1.5 (11.11.1998) by SDI",0
  35. N_PACKPepsi    DC.B    'PACK Data (Pepsi Game)',0
  36.         EVEN
  37.  
  38. Slave1        DC.L    0        ;next slave
  39.         DC.W    2        ;version
  40.         DC.W    38        ;master version
  41.         DC.L    N_PACKPepsi    ;name
  42.         DC.W    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  43.         DC.W    0
  44.         DC.L    RB_PACKPepsi    ;recog buffer
  45.         DC.L    DB_PACKPepsi    ;decrunch buffer
  46.         DC.L    0        ;recog segment
  47.         DC.L    0        ;decrunch segment
  48.         DC.W    0,0
  49.         DC.L    $10        ;MinBufSize
  50.  
  51. *************************************************************************
  52. *    Recog buffer function: receives buffer + length in A0/D0    *
  53. *    and receives pointer to struct RecogResult in A1        *
  54. *************************************************************************
  55.  
  56. PEP_SOURCELEN    EQU    4
  57. PEP_DESTLEN    EQU    8
  58. PEP_PACKMATCH    EQU    $025569EE
  59.  
  60. RB_PACKPepsi    MOVEQ    #0,D0            ; False
  61.  
  62.         CMPI.L    #"PACK",(A0)
  63.         BNE.B    .No
  64.  
  65.         MOVE.L    PEP_SOURCELEN(A0),D1
  66.         SUBI.L    #PEP_PACKMATCH,D1 ; must be greater than PACKMATCH
  67.         BLE.B    .No
  68.         CMP.L    #$C800000,D1      ; should be shorther than 200MB
  69.         BGT.B    .No
  70.         MOVE.L    PEP_DESTLEN(A0),D1
  71.         CMP.L    PEP_SOURCELEN(A0),D1 ; source <= destination
  72.         BLE.B    .No
  73.         SUBI.L    #PEP_PACKMATCH,D1 ; must be greater than PACKMATCH
  74.         BLE.B    .No
  75.         CMP.L    #$C800000,D1      ; should be shorther than 200MB
  76.         BGT.B    .No
  77.  
  78.         MOVE.L    D1,xfdrr_FinalTargetLen(A1)
  79.         MOVE.L    D1,xfdrr_MinTargetLen(A1)
  80.         MOVEQ    #1,D0            ; True
  81. .No        RTS
  82.  
  83. *************************************************************************
  84. *    Decrunch buffer functions: receives xfdbiBufferInfo in A0    *
  85. *************************************************************************
  86.  
  87. DB_PACKPepsi    MOVEM.L    D2-D5/A2/A4-A6,-(A7)
  88.         MOVE.L    4.W,A6
  89.         MOVE.L    A0,A5
  90.         MOVE.L    xfdbi_SourceBuffer(A5),A4
  91.  
  92.         MOVE.W    #XFDERR_NOMEMORY,xfdbi_Error(A5)
  93.         MOVE.L    PEP_DESTLEN(A4),D0
  94.         SUBI.L    #PEP_PACKMATCH,D0
  95.         MOVE.L    xfdbi_UserTargetBuf(A5),A1
  96.         MOVE.L    D0,xfdbi_TargetBufSaveLen(A5)
  97.  
  98.         BTST.B    #XFDFB_USERTARGET,1+xfdbi_Flags(A5)
  99.         BNE.B    .Decrunch
  100.  
  101.         MOVE.L    D0,xfdbi_TargetBufLen(A5)
  102.         MOVE.L    xfdbi_TargetBufMemType(A5),D1
  103.         JSR    _LVOAllocMem(A6)
  104.         MOVE.L    D0,xfdbi_TargetBuffer(A5)
  105.         BEQ.B    .End
  106.  
  107.         MOVE.L    D0,A1
  108. .Decrunch    MOVE.L    A4,A0
  109.         LEA.L    $10(A0),A0    * pack space start
  110.         MOVE.L    xfdbi_TargetBufSaveLen(A5),D1
  111.         MOVE.L    PEP_SOURCELEN(A4),D0
  112.         SUBI.L    #PEP_PACKMATCH,D0
  113.         MOVE.W    #XFDERR_CORRUPTEDDATA,xfdbi_Error(A5)
  114.  
  115.         BSR.B    DecompPepsi
  116.  
  117.         BTST.B    #XFDFB_USERTARGET,1+xfdbi_Flags(A5)
  118.         BNE.B    .End
  119.         TST.L    D0
  120.         BNE.B    .ok
  121.         MOVE.L    xfdbi_TargetBuffer(A5),A1
  122.         MOVE.L    xfdbi_TargetBufLen(A5),D0
  123.         JSR    _LVOFreeMem(A6)
  124.         MOVEQ    #0,D0
  125.         BRA.B    .End
  126. .ok        CLR.W    xfdbi_Error(A5)
  127.         MOVEQ    #1,D0
  128. .End        MOVEM.L    (A7)+,D2-D5/A2/A4-A6
  129.         RTS
  130.  
  131. *************************************************************************
  132. *          decrunch routine for Pepsi PACK data            *
  133. *                                    *
  134. *    gets following parameters:                    *
  135. *        D0    crunched size                    *
  136. *        D1    uncrunched size                    *
  137. *        A0    source buffer                    *
  138. *        A1    destination buffer                *
  139. *    returns D0: 0 = error                        *
  140. *************************************************************************
  141.  
  142. DecompPepsi    MOVEA.L    A1,A2
  143.         MOVE.L    -4(A0),D5    * checksum
  144.         ADDA.L    D0,A0    * get end of source buffer
  145.         ADDA.L    D1,A2    * get end of destination buffer
  146.         MOVE.L    -(A0),D0
  147.         EOR.L    D0,D5
  148. .Decr1        LSR.L    #1,D0
  149.         BNE.B    .Decr2
  150.         BSR.B    .DecrSub1
  151. .Decr2        BCS.B    .Decr9
  152.         MOVEQ    #8,D1
  153.         MOVEQ    #1,D3
  154.         LSR.L    #1,D0
  155.         BNE.B    .Decr3
  156.         BSR.B    .DecrSub1
  157. .Decr3        BCS.B    .Decr11
  158.         MOVEQ    #3,D1
  159.         CLR.W    D4
  160. .Decr4        BSR.B    .DecrSub2
  161.         MOVE.W    D2,D3
  162.         ADD.W    D4,D3
  163. .Decr5        MOVEQ    #7,D1
  164. .Decr6        LSR.L    #1,D0
  165.         BNE.B    .Decr7
  166.         BSR.B    .DecrSub1
  167. .Decr7        ROXL.L    #1,D2
  168.         DBRA    D1,.Decr6
  169.         MOVE.B    D2,-(A2)
  170.         DBRA    D3,.Decr5
  171.         BRA.B    .Decr13
  172.  
  173. .Decr8        MOVEQ    #8,D1
  174.         MOVEQ    #8,D4
  175.         BRA.B    .Decr4
  176.  
  177. .Decr9        MOVEQ    #2,D1
  178.         BSR.B    .DecrSub2
  179.         CMPI.B    #2,D2
  180.         BLT.B    .Decr10
  181.         CMPI.B    #3,D2
  182.         BEQ.B    .Decr8
  183.         MOVEQ    #8,D1
  184.         BSR.B    .DecrSub2
  185.         MOVE.W    D2,D3
  186.         MOVE.W    #$C,D1
  187.         BRA.B    .Decr11
  188.  
  189. .Decr10        MOVE.W    #9,D1
  190.         ADD.W    D2,D1
  191.         ADDQ.W    #2,D2
  192.         MOVE.W    D2,D3
  193. .Decr11        BSR.B    .DecrSub2
  194. .Decr12        SUBQ.W    #1,A2
  195.         MOVE.B    (A2,D2.W),(A2)
  196.         DBRA    D3,.Decr12
  197. .Decr13        CMPA.L    A2,A1
  198.         BLT.B    .Decr1
  199.         MOVEQ    #0,D0    * error
  200.         TST.L    D5        * checksum ok ?
  201.         BNE.B    .End
  202.         MOVEQ    #1,D0    * no error
  203. .End        RTS    
  204.  
  205. .DecrSub1    MOVE.L    -(A0),D0
  206.         EOR.L    D0,D5        * checksum
  207.         MOVE    #$10,CCR
  208.         ROXR.L    #1,D0
  209.         RTS    
  210.  
  211. .DecrSub2    SUBQ.W    #1,D1
  212.         CLR.W    D2
  213. .DecrSub2_1    LSR.L    #1,D0
  214.         BNE.B    .DecrSub2_2
  215.         MOVE.L    -(A0),D0
  216.         EOR.L    D0,D5        * checksum
  217.         MOVE    #$10,CCR
  218.         ROXR.L    #1,D0
  219. .DecrSub2_2    ROXL.L    #1,D2
  220.         DBRA    D1,.DecrSub2_1
  221.         RTS    
  222.         END
  223.